package ar.edu.utn.frba.disenio;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

import ar.edu.utn.frba.disenio.exceptions.NoExisteReservaException;
import ar.edu.utn.frba.disenio.exceptions.NoSePuedeComprarException;

public class ReservasManager
{
	private Map<Reserva,LinkedList<Reserva>> reservaception = new HashMap<Reserva,LinkedList<Reserva>>();
	
	public void reservar(Asiento asiento,Usuario usuario)
	{
		try 
		{
			Reserva reservaActual = this.getReserva(asiento);
			sobreReservar(asiento, getReservaception().get(reservaActual), usuario);
		} 
		catch (NoExisteReservaException e)
		{
			Reserva reserva = new Reserva();
			reserva.setAsiento(asiento);
			reserva.setUsuario(usuario);
			getReservaception().put(reserva, new LinkedList<Reserva>());
		}
	}
	
	public void controlDeVentaDeReserva(Asiento asiento,Usuario usuario)
	{
		try {
			Reserva reserva = this.getReserva(asiento);
			if(reserva.getUsuario().equals(usuario))
			{
				getReservaception().remove(reserva);
			}
			else
			{
				throw new NoSePuedeComprarException();
			}
		} catch (NoExisteReservaException e) {
			//El usuario esta habilitado para comprar
		}
	}
	
	public void cancelarReservacion(Asiento asiento,Usuario usuario)
	{
		for(Reserva reserva : getReservaception().keySet())
		{
			if(reserva.getAsiento().getCodigo().equals(asiento.getCodigo()))
			{				
				if(usuario.equals(reserva.getUsuario()))
				{
					//Se quiere cancelar la reserva.
					LinkedList<Reserva> sobreReservas = getReservaception().get(reserva);
					Reserva nuevaReserva = sobreReservas.getFirst();
					sobreReservas.remove(nuevaReserva);
					getReservaception().put(nuevaReserva, sobreReservas);
					getReservaception().remove(reserva);
					return;
				}
				else
				{
					//Se quiere cancelar una sobrereserva.
					LinkedList<Reserva> listaReservas = reservaception.get(reserva);
					this.cancelarSobrereserva(asiento, usuario, listaReservas);
				}
			}
		}
		return ;
	}
	
	private void cancelarSobrereserva(Asiento asiento, Usuario usuario, LinkedList<Reserva> listaReservas) 
	{
		for(Reserva reserva : new LinkedList<Reserva>(listaReservas))
		{
			if(reserva.getAsiento().equals(asiento) && reserva.getUsuario().equals(usuario))
			{
				listaReservas.remove(reserva);
			}
		}
	}

			/* USAR EL METODO getReserva() */	
//	public boolean containsAsiento(Asiento asiento)
//	{
//		for(Reserva reserva : getReservaception().keySet())
//		{
//			if(reserva.getAsiento().getCodigo().equals(asiento.getCodigo()))
//			{				
//				return true;
//			}
//		}
//		return false;
//	}
	
	public Reserva getReserva(Asiento asiento)
	{
		for(Reserva reserva : getReservaception().keySet())
		{
			if(reserva.getAsiento().getCodigo().equals(asiento.getCodigo()))
			{				
				return reserva;
			}
		}
		throw new NoExisteReservaException();
	}
	
	public LinkedList<Reserva> getSobreReservas(Asiento asiento)
	{
		Reserva reserva  = this.getReserva(asiento);
		return reservaception.get(reserva);
	}

	private void sobreReservar(Asiento asiento,LinkedList<Reserva> sobreReservas,Usuario usuario) 
	{
		Reserva sobreReserva = new Reserva();
		sobreReserva.setAsiento(asiento);
		sobreReserva.setUsuario(usuario);
		sobreReservas.addLast(sobreReserva);
	}

	public Map<Reserva,LinkedList<Reserva>> getReservaception() {
		return reservaception;
	}

	public void setReservaception(Map<Reserva,LinkedList<Reserva>> reservaception) {
		this.reservaception = reservaception;
	}



}
